
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controladores;

import DataTypes.DataEvento;
import DataTypes.DataHistorial;
import DataTypes.DataMensaje;
import DataTypes.DataUsuario;
import Hndlr.HndlrUsuario;
import Interfaces.Factory;
import Interfaces.ICtrlRelojSistema;
import Interfaces.ICtrlUsuarios;
import WebServices.CtrlUsuariosWS;
import com.sun.xml.internal.fastinfoset.util.StringArray;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;

import objetos.Historial;
import objetos.Mensaje;
import objetos.Usuario;

/**
 *
 * @author jota
 */
public class CtrlUsuarios implements ICtrlUsuarios {

    private HndlrUsuario Husu = HndlrUsuario.getInstance();

    @Override
    public void altaUsuario(DataUsuario du) throws IOException {
        if (!(new File("C:\\Server\\")).exists()) {
            (new File("C:\\Server\\")).mkdir();
        }
        if (!(new File("C:\\Server\\"+du.getCorreo())).exists()) {
            (new File("C:\\Server\\"+du.getCorreo())).mkdir();
        }
        Husu.AltaUsuario(du);
    }

    @Override
    public void bloquearUsuario(DataUsuario du) throws IOException {
        Husu.BloqueoUsuario(du);
    }

    @Override
    public HashMap listaUsuarios() {

        return Husu.listaUsuarios();

    }

    @Override
    public boolean containsKey(String clave) {
        return Husu.containsKey(clave);
    }

    @Override
    public DataUsuario getUsuario(String clave) {

        return Husu.getUsuario(clave);

    }
    
    @Override
    public Usuario getUSuarioU(String clave){
        
        return Husu.getUsuarioU(clave);
    }

//    @Override
    @Override
    public void ModificarUsuario(DataUsuario du, String clave) {
        
        Husu.quitarUsuario(clave);
        try {
            this.altaUsuario(du);
        } catch (IOException ex) {
            Logger.getLogger(CtrlUsuarios.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    @Override
    public ArrayList<DataUsuario> listarDUsuarios() {
        return Husu.listarDUsuarios();
    }

    @Override
    public void AgregarAmigo(String claveUsu, String amigo, Calendar c) throws IOException {

        Husu.AgregarAmigo(claveUsu, amigo);

    }

    @Override
    public ArrayList<DataUsuario> listarDAmigos(String ClaveUsu) {
        return Husu.listarDAmigos(ClaveUsu);
    }

    @Override
    public void quitarAmigo(String claveUsu, String amigo) throws IOException {
        Husu.quitarAmigo(claveUsu, amigo);
    }

    @Override
    public boolean esCreadorGrupo(String correo) {
        return Husu.esCreadorGrupo(correo);
    }

    @Override
    public void agregarEvento(DataEvento even, String usu) {
        Husu.agregarEvento(even, usu);
    }

    @Override
    public HashMap<String, DataEvento> listarCalendarioEventos(String nomGrup) {

        return Husu.listarCalendarioEventos(nomGrup);
    }

    @Override
    public boolean coincidePassUsr(String mail, String pass) {

        return Husu.getUsuario(mail).getContrasena().equals(pass);

    }

    @Override
    public boolean yaExisteNick(String nick) {

        return Husu.yaExisteNick(nick);

    }

    @Override
    public boolean cambioPassUsr(String mail) {
        HndlrUsuario hUsr = HndlrUsuario.getInstance();
        Usuario usr = hUsr.obtenerUsuario(mail);
        return usr.isCambioPass();
    }

    @Override
    public boolean sonUsrAmigos(String mail1, String mail2) {
        Iterator<DataUsuario> itera = Husu.listarDAmigos(mail1).iterator();
        boolean sonAmigos = false;
        while (itera.hasNext() && !sonAmigos) {
            sonAmigos = itera.next().getCorreo().equals(mail2);
        }
        return sonAmigos;
    }

    @Override
    public void activarNotificaciones(String mailUsr, boolean activar) {
        Husu.activarNotificaciones(mailUsr, activar);
    }
    
    @Override
    public void agregarHistorial(String idUsuario,String idAmigo,ArrayList<DataMensaje>list){
        
        Husu.agregarHistorial(idUsuario, idAmigo, list);
        
    }
    @Override
    public DataHistorial getHistorial(String usu,String amigo){
       
        Usuario usuario = Husu.getUsuarioU(usu);
        Historial hist = usuario.getHistoriales().get(amigo);
        DataHistorial dHist = new DataHistorial();
        
        if(hist!=null){
        Iterator<Mensaje> it = hist.getMensajes().iterator();
        dHist.setIdAmigo(hist.getIdAmigo());
        ArrayList<DataMensaje> resul = new ArrayList<DataMensaje>();
        
        while(it.hasNext()){
            
            Mensaje men = it.next();
            DataMensaje dmens = new DataMensaje();
            dmens.setEmisor(men.getEmisor());
            dmens.setFecha(men.getFecha());
            dmens.setMsj(men.getMsj());
            resul.add(dmens);
                
        }
        dHist.setMensajes(resul);
        }
        else 
            return null;
        return dHist;
        
        
    }

    @Override
    public void agregarSolicitudAmistad(String solicitante, String solicitado) {
        //PRE: No son amigos usuarios.
        Usuario usrSolicitado = HndlrUsuario.getInstance().getUsuarioU(solicitado);
        Usuario usrSolicitante = HndlrUsuario.getInstance().getUsuarioU(solicitante);
        
        usrSolicitado.agregarSolicitudAmistad(usrSolicitante);
    }

    @Override
    public boolean existeSolicitudUsuario(String solicitante, String solicitado) {

        Usuario usrSolicitado = HndlrUsuario.getInstance().getUsuarioU(solicitado);
        return usrSolicitado.existeSolicitudUsuario(solicitante);
        
    }

    @Override
    public void cancelarSolicitud(String solicitante, String solicitado) {
        
        Usuario usrSolicitado = HndlrUsuario.getInstance().getUsuarioU(solicitado);
        usrSolicitado.cancelarSolicitudAmistad(solicitante);
    }
    
    @Override
    public void aceptarSolicitud(String solicitante, String solicitado) {
        
        Usuario usrSolicitado = HndlrUsuario.getInstance().getUsuarioU(solicitado);
        usrSolicitado.quitarSolicitudAmistad(solicitante);
        
        ICtrlRelojSistema ctrlReloj = Factory.getInstance().getRelojSistema();
        Calendar cal = ctrlReloj.getTime();
        try {
            this.AgregarAmigo(solicitado, solicitante, cal);
        } catch (IOException ex) {
            Logger.getLogger(CtrlUsuarios.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    @Override
    public ArrayList<DataUsuario> listarSolicitudes(String mailUsr){
        ArrayList<DataUsuario> result = new ArrayList<DataUsuario>();
        Iterator<Usuario> itera = HndlrUsuario.getInstance().getUsuarioU(mailUsr).getSolicitudAmistad().values().iterator();
        DataUsuario dUsr = null;
        Usuario usr = null;
        while (itera.hasNext()){
            usr = itera.next();
            dUsr = usr.getDusuario();
            result.add(dUsr);
        }
        return result;
    }

    @Override
    public int promedioPuntajeUsr(String mailUsr) {

        Usuario usr = HndlrUsuario.getInstance().getUsuarioU(mailUsr);
        
        return usr.getPromedioPuntaje();
        
    }

    @Override
    public ArrayList<DataUsuario> listarSugerenciaAmigos(final String mailUsr) {
        ArrayList<DataUsuario> lista = new ArrayList<DataUsuario>();
        Iterator<Usuario> itera = HndlrUsuario.getInstance().listaUsuarios().values().iterator();
        Usuario usr = null;
        DataUsuario dUsr = null;
        while (itera.hasNext()){
            usr = itera.next();
            if (!usr.getCorreo().equals(mailUsr) 
                && !sonUsrAmigos(usr.getCorreo(), mailUsr)
                && !existeSolicitudUsuario(mailUsr, usr.getCorreo())
                && !existeSolicitudUsuario(usr.getCorreo(), mailUsr)){
                dUsr = usr.getDusuario();
                lista.add(dUsr);
            }
        }
        
        class compararPorAmigosEnComun implements Comparator {
            String mail = mailUsr;
            @Override
            public int compare(Object o1, Object o2) {
                
                DataUsuario usr1 = (DataUsuario)o1;
                DataUsuario usr2 = (DataUsuario)o2;
                CtrlUsuariosWS ctrl = new CtrlUsuariosWS();
                String amigosEnComun1[] = new String[2];
                String amigosEnComun2[] = new String[2];
                amigosEnComun1[0]=(this.mail);
                amigosEnComun1[1]=(usr1.getCorreo());
                amigosEnComun2[0]=(this.mail);
                amigosEnComun2[1]=(usr2.getCorreo());
                int result = 0;
                if (ctrl.amigosEnComun(amigosEnComun1).length < ctrl.amigosEnComun(amigosEnComun2).length){
                    result = 1;
                }
                if (ctrl.amigosEnComun(amigosEnComun1).length > ctrl.amigosEnComun(amigosEnComun2).length){
                    result = -1;
                }
                return result;
                
            }
            
        }
        
        Collections.sort(lista, new compararPorAmigosEnComun());
        
        class compararPorPuntaje implements Comparator {
            
            @Override
            public int compare(Object o1, Object o2) {
                
                DataUsuario usr1 = (DataUsuario)o1;
                DataUsuario usr2 = (DataUsuario)o2;
                ICtrlUsuarios ctrl = Factory.getInstance().getUsuarios();
                int result = 0;
                if (ctrl.promedioPuntajeUsr(usr1.getCorreo()) > ctrl.promedioPuntajeUsr(usr2.getCorreo())){
                    result = -1;
                }
                if (ctrl.promedioPuntajeUsr(usr1.getCorreo()) < ctrl.promedioPuntajeUsr(usr2.getCorreo())){
                    result = 1;
                }
                return result;
            }
            
        }
        
        Collections.sort(lista, new compararPorPuntaje());
        
        return lista;
        
    }
}
